//
//  CZRefreshView.swift
//  Weibo24
//
//  Created by apple on 16/3/4.
//  Copyright © 2016年 apple. All rights reserved.
//

import UIKit
import SnapKit

/*
    1.视图界面分析
    2.功能分析
*/

/*
    界面分析
    1.3个组件 -- 提示label, 提示下拉的图片, 加载的图片
    2.加在哪里? -- 加TableView
*/
/*
    功能分析
    1. 如何确定我的下拉刷新的状态
        1.1 loading状态如何确定

    2. 相应状态对应的视图变化
        1.1 在哪里去实现视图的改变

*/


//分析出三个状态
enum RefreshType: Int {
    // case 后边没有 :
    // 正常的状态
    case Normal = 0
    // 拖拽的状态
    case Pulling = 1
    // 加载状态
    case Loading = 2
    
}

class CZRefreshView: UIControl {

//    // 成员变量
    var scrollView: UIScrollView?
    
    // 记录一下过去的状态
    var oldStatus: RefreshType = .Normal
    
    // 定义一个属性,来记录状态,默认是 正常状态
    var status: RefreshType = .Normal{
    
        didSet{
            
            switch status{
            
            case .Normal: print("正常状态")
            
                // 文字
                messageLabel.text = "下拉刷新"
                
            case .Pulling: print("下拉状态")
                messageLabel.text = "释放刷新"
                
            case .Loading: print("加载中 ...")
                messageLabel.text = "加载中... ..."
                //加载的时候,让视图显示在 Nav下边 修改  scrollView?.contentInset
                var inset = scrollView?.contentInset
                inset?.top += 64
                scrollView?.contentInset = inset!
            
            // 没有触发 ValueChange的事件
            // 去触发一下 ValueChanged ,然后让 target 去发送请求
            // 这个方法是借助于 UIControl
            // 不明白用--通知
            sendActionsForControlEvents(UIControlEvents.ValueChanged)
            // 记录加载的状态
                oldStatus = .Loading
                //需要恢复回去 
            }
            
        }
        
    }
    
    func endRefreshing(){
        
        // 加载完成
        status = .Normal
        
        if oldStatus == .Loading{
            
            //加载的时候,让视图显示在 Nav下边 修改  scrollView?.contentInset
            var inset = scrollView?.contentInset
            inset?.top -= 64
            scrollView?.contentInset = inset!
        
            //恢复标记
            oldStatus = .Normal
            
        }

    }
    
   override init(frame: CGRect) {
        super.init(frame: frame)
    
        backgroundColor = UIColor.yellowColor()
    
        setupUI()
    }

   required init?(coder aDecoder: NSCoder) {
       fatalError("init(coder:) has not been implemented")
   }

    //
    private func setupUI(){
    
        // 设置frame
        //获取系统的frame
        var frame = self.frame
        //修改frame
        frame.size = CGSizeMake(kUIScreenWidth, 50)
        frame.origin.y = -50
        // 赋值
        self.frame = frame
        
        
        //添加视图和约束
        addSubview(messageLabel)
        addSubview(arrowImageView)
        addSubview(loadingImageView)
        
        
        //添加约束 
        // 水平居中,往右30个点,垂直居中
        messageLabel.snp_makeConstraints { (make) -> Void in
            
            make.centerX.equalTo(self.snp_centerX).offset(30)
            make.centerY.equalTo(self.snp_centerY)
            
        }
        
        // messageLabel的左边, 水平居中
        arrowImageView.snp_makeConstraints { (make) -> Void in
            make.centerY.equalTo(self.snp_centerY)
            make.right.equalTo(messageLabel.snp_left)
        }
        
        loadingImageView.snp_makeConstraints { (make) -> Void in
            // 注意 make.center.equalTo(arrowImageView.center) 不一样
            make.center.equalTo(arrowImageView.snp_center)
        }
    }
 
    // 添加KVO
    // 这个方法是,我们把 子控件添加到父控件的时候会调用这个方法
    // newSuperview是 UITableView
    override func willMoveToSuperview(newSuperview: UIView?) {
        super.willMoveToSuperview(newSuperview)
        
        // 1.先把 newSuperview 转换一下 UIScrollView
        
        scrollView = newSuperview as? UIScrollView
        
        // 2.添加监听
        scrollView?.addObserver(self, forKeyPath: "contentOffset", options: NSKeyValueObservingOptions.New, context: nil)
    }
    
    override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) {
        
        if keyPath == "contentOffset"{
        
        }
        
        let scrollView = object as? UIScrollView
    
//        print(scrollView?.contentOffset.y)
        // 给 scrollView一个强制 ,建议大家不用强转
        //第三步: 确定了 三种状态
        if scrollView!.dragging { // 拖拽的时候 再去判断我们的状态
           
            if scrollView?.contentOffset.y < -150 {
                
                //改变状态
//                print("改变成 释放刷新")
                status = .Pulling
                
                //调用一个方法,去改变视图
                
                
            } else if scrollView?.contentOffset.y < -114 && scrollView?.contentOffset.y > -150{
//                print("正常状态,下拉刷新")
                //记录一下状态
                status = .Normal
                
                 //调用一个方法,去改变视图
            }
            
        } else { // 松手的时候
        
             // 当 scrollView?.contentOffset.y 的在一个范围之内,去加载
            //
            if scrollView?.contentOffset.y < -150 && status == .Pulling{
            
                status = .Loading
                
//                print("加载中... ...")
                 //调用一个方法,去改变视图
            }
        }
       
        
    }
    
    //MARK:--懒加载
    /// 提示语
    private lazy var messageLabel: UILabel = {
    
        let label = UILabel()
        
        label.text = "下拉刷新"
        
        label.textColor = UIColor.redColor()
        
        label.font = UIFont.systemFontOfSize(15)
        
        return label
        
    }()
///  箭头
    private lazy var arrowImageView: UIImageView = {
    
        let img = UIImageView()
        
        img.image = UIImage(named: "tableview_pull_refresh")
        
        return img
    }()
    
///  加载的视图
    private lazy var loadingImageView: UIImageView = {
        
        let img = UIImageView()
        
        img.image = UIImage(named: "tableview_loading")
        
        img.hidden = true
        
        return img
    }()
    
    
    
    deinit {
    
        //移除监听
        removeObserver(self, forKeyPath: "contentOffset")
        
    }
}
